package com.laoyang.rabbit;

import com.alibaba.fastjson.JSON;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author com.yyy
 * @Date 2020-09-12 13:32
 * @Email yangyouyuhd@163.com
 */
public class RabbitTemplate {

    static void send(Object msg){
        try {
            获取泛型(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void 获取泛型(Object obj) throws Exception {
        // 获取class
        Class<获取泛型> clazz = 获取泛型.class;
        // 获取实例
        获取泛型 instance = clazz.newInstance();
        // 获取所有方法
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            // 方法含有指定注解
            if(method.isAnnotationPresent(RabbitListener.class)){
                // 获取泛型参数类型
                Type[] types = method.getGenericParameterTypes();
                for (Type type : types) {
                    // 强转子类
                    ParameterizedType typeImpl = (ParameterizedType) type;
                    // 比较泛型类型和 指定 实体类型
                    if(typeImpl.getRawType() == Message.class){
                        // 泛型一般就一个 、获取第一个
                        Type genericType = typeImpl.getActualTypeArguments()[0];
                        // 获取泛型类的全路径名
                        String typeName = genericType.getTypeName();
                        // 反射获取类信息
                        Class<?> genericClazz = Class.forName(typeName);
                        // 将消息json化
                        String msg = JSON.toJSONString(obj);
                        // 实例化 参数值
                        Message message = new Message();
                        Object o1 = JSON.parseObject(msg, genericClazz);
                        message.setBody(o1);
                        // 执行业务方法
                        method.invoke(instance,message);
                    }
                }
            }
        }
    }


}
